1. Описание признаков присутствует в сопроводительном файле. Прочитаем данные. Среди данных не может быть отрицательных значений, NA обозначаются как -999.
library(readxl)
library(dplyr)
library(tidyr)
df <- read_excel("Sleep/SLEEP_shortname.xls")
df[df < 0] <- NA
head(df)
## # A tibble: 6 × 11
## NAME BODY_…¹ BRAIN…² SLOWW…³ PARADOX SLEEP LIFES…⁴ GESTT…⁵ PRED_…⁶ EXP_IND
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 African… 6654 5712 NA NA 3.3 38.6 645 3 5
## 2 African… 1 6.6 6.3 2 8.3 4.5 42 3 1
## 3 Arctic … 3.38 44.5 NA NA 12.5 14 60 1 1
## 4 Arc. gr… 0.92 5.7 NA NA 16.5 NA 25 5 2
## 5 Asian e… 2547 4603 2.1 1.8 3.9 69 624 3 5
## 6 Baboon 10.6 180. 9.1 0.7 9.8 27 180 4 4
## # … with 1 more variable: DANG_IND <dbl>, and abbreviated variable names
## # ¹BODY_WEI, ²BRAIN_WE, ³SLOWWAVE, ⁴LIFESPAN, ⁵GESTTIME, ⁶PRED_IND
## # ℹ Use `colnames()` to see all variable names
Количество строк в таблице.
nrow(df)
## [1] 62
2. Признаков немного, поэтому рассматривать будем все.
3. Кроме индексов-факторов, все признаки количественные. Индексы - порядковые признаки. Все количественные признаки непрерывные, но можно заметить дискретизацию при округлении. Проверим это, посмотрев на частоты мод.
find_mode <- function(x) {
x <- x[!is.na(x)]
u <- unique(x)
tab <- tabulate(match(x, u))
c(u[tab == max(tab)], max(tab))
}
find_mode(df$BODY_WEI)
## [1] 0.023 3.500 2.000
find_mode(df$BRAIN_WE)
## [1] 115.0 1.0 12.3 2.0
find_mode(df$SLOWWAVE)
## [1] 11 3
find_mode(df$PARADOX)
## [1] 2.0 1.8 0.5 0.9 3.0
find_mode(df$SLEEP)
## [1] 12.5 10.3 8.4 3.0
find_mode(df$LIFESPAN)
## [1] 7 3
find_mode(df$GESTTIME)
## [1] 42 63 3
Функция выводит моды (если их несколько), потом частоту. Видно, что проблемы с округлением есть. Продолжительность периода вынашивания потомства почти полностью состоит из целых чисел, поэтому будем считать ее дискретным признаком. Остальные признаки будем считать непрерывными но с ошибками округления.
4. Не актуально для текущих данных.
5. Посмотрим на данные.
library(ggplot2)
library(GGally)
df %>% dplyr::select(-NAME) %>%
ggpairs(diag=list(continuous = "barDiag"),
columns = c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))
6. Преобразуем данные. Переведем вес животного в граммы, продолжительность жизни в дни. Логарифмируем данные, чтобы было легче наблюдать корреляции (выше заметны сильно отличающиеся индивиды, это слоны). Факторизуем индексы.
dfNew <- df %>% mutate(PRED_IND = as.factor(PRED_IND), EXP_IND = as.factor(EXP_IND),
DANG_IND = as.factor(DANG_IND),
BODY_WEI = log(BODY_WEI * 1000), BRAIN_WE = log(BRAIN_WE),
LIFESPAN = log(LIFESPAN * 365.25), GESTTIME = log(GESTTIME))
Посмотрим на новые данные. Сгруппируем индивидов по факторам.
dfNew %>% dplyr::select(-NAME) %>%
ggpairs(diag=list(continuous = "barDiag"),
columns = c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))
dfNew %>% dplyr::select(-NAME) %>%
ggpairs(diag=list(continuous = "barDiag"), aes(colour=PRED_IND), legend=1,
columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))
dfNew %>% dplyr::select(-NAME) %>%
ggpairs(diag=list(continuous = "barDiag"), aes(colour=EXP_IND), legend=1,
columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))
dfNew %>% dplyr::select(-NAME) %>%
ggpairs(diag=list(continuous = "barDiag"), aes(colour=DANG_IND), legend=1,
columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))
7. Аутлайнеров нет.
8. Неоднородности нет.
9. Не актуально для текущих данных.
10. Используем описательные статистики для распределений признаков в новой выборке.
library(moments)
library(entropy)
Вес тела.
mean(dfNew$BODY_WEI, na.rm = TRUE)
## [1] 8.245294
quantile(dfNew$BODY_WEI, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 1.609438 6.387457 8.114393 10.771653 15.710729
var(dfNew$BODY_WEI, na.rm = TRUE)
## [1] 9.753926
skewness(dfNew$BODY_WEI, na.rm = TRUE)
## [1] 0.1489489
kurtosis(dfNew$BODY_WEI, na.rm = TRUE)
## [1] 2.558601
Вес мозга.
mean(dfNew$BRAIN_WE, na.rm = TRUE)
## [1] 3.140198
quantile(dfNew$BRAIN_WE, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
## 0% 25% 50% 75% 100%
## -1.966113 1.442080 2.847707 5.111485 8.650325
var(dfNew$BRAIN_WE, na.rm = TRUE)
## [1] 5.985421
skewness(dfNew$BRAIN_WE, na.rm = TRUE)
## [1] 0.04451474
kurtosis(dfNew$BRAIN_WE, na.rm = TRUE)
## [1] 2.460244
Медленный сон.
mean(dfNew$SLOWWAVE, na.rm = TRUE)
## [1] 8.672917
quantile(dfNew$SLOWWAVE, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 2.10 6.25 8.35 11.00 17.90
var(dfNew$SLOWWAVE, na.rm = TRUE)
## [1] 13.44287
skewness(dfNew$SLOWWAVE, na.rm = TRUE)
## [1] 0.2888462
kurtosis(dfNew$SLOWWAVE, na.rm = TRUE)
## [1] 2.665648
Быстрый сон.
mean(dfNew$PARADOX, na.rm = TRUE)
## [1] 1.972
quantile(dfNew$PARADOX, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 0.00 0.90 1.80 2.55 6.60
var(dfNew$PARADOX, na.rm = TRUE)
## [1] 2.081241
skewness(dfNew$PARADOX, na.rm = TRUE)
## [1] 1.408774
kurtosis(dfNew$PARADOX, na.rm = TRUE)
## [1] 4.976392
Cон.
mean(dfNew$SLEEP, na.rm = TRUE)
## [1] 10.53276
quantile(dfNew$SLEEP, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 2.60 8.05 10.45 13.20 19.90
var(dfNew$SLEEP, na.rm = TRUE)
## [1] 21.22224
skewness(dfNew$SLEEP, na.rm = TRUE)
## [1] 0.1960028
kurtosis(dfNew$SLEEP, na.rm = TRUE)
## [1] 2.43348
Продолжительность жизни.
mean(dfNew$LIFESPAN, na.rm = TRUE)
## [1] 8.493641
quantile(dfNew$LIFESPAN, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 6.593729 7.790911 8.612616 9.223695 10.505752
var(dfNew$LIFESPAN, na.rm = TRUE)
## [1] 0.8902197
skewness(dfNew$LIFESPAN, na.rm = TRUE)
## [1] -0.1672212
kurtosis(dfNew$LIFESPAN, na.rm = TRUE)
## [1] 2.158602
Продолжительность периода вынашивания потомства.
mean(dfNew$GESTTIME, na.rm = TRUE)
## [1] 4.444191
quantile(dfNew$GESTTIME, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 2.484907 3.575908 4.359659 5.334910 6.469250
var(dfNew$GESTTIME, na.rm = TRUE)
## [1] 1.124134
skewness(dfNew$GESTTIME, na.rm = TRUE)
## [1] 0.04858356
kurtosis(dfNew$GESTTIME, na.rm = TRUE)
## [1] 1.925085
1. Проверим распределения признаков на нормальность.
library(reshape)
Изобразим гистограммы признаков на фоне плотности нормального распределения.
dfMelt <- dfNew %>%
dplyr::select(-PRED_IND, -DANG_IND) %>%
as.data.frame(dfNew) %>%
melt(id.vars = c("NAME", "EXP_IND"))
ggplot(dfMelt, aes(x = value)) +
geom_histogram(aes(y = ..density..)) +
facet_wrap(~variable, scales = "free") +
labs(x = "", y = "") +
geom_line(aes(y = dnorm(value,
mean = tapply(value, variable, mean, na.rm = TRUE)[PANEL],
sd = tapply(value, variable, sd, na.rm = TRUE)[PANEL]
)), color = "blue")
Изобразим выборочную функцию распредления признаков на фоне функции распределения нормального распределения.
ggplot(dfMelt, aes(x = value)) +
stat_ecdf() +
facet_wrap(~variable, scales = "free") +
labs(x = "", y = "") +
geom_line(aes(y = pnorm(value,
mean = tapply(value, variable, mean, na.rm = TRUE)[PANEL],
sd = tapply(value, variable, sd, na.rm = TRUE)[PANEL]
)), color = "blue")
Давайте еще нарисуем PP-plot и QQ-plot.
library(qqplotr)
ggplot(dfMelt, aes(sample = value)) +
stat_pp_point(size = 1) +
facet_wrap(~variable, scales = "free") +
labs(x = "", y = "") +
stat_pp_line(color = "blue")
ggplot(dfMelt, aes(sample = value)) +
stat_qq_point(size = 1) +
facet_wrap(~variable, scales = "free") +
labs(x = "", y = "") +
stat_qq_line(color = "blue")
2. Похоже, что нормальность имеет место. Проверим это с помощью критериев.
library(nortest)
У нас не так много повторений в выборке, чтобы не использовать критерий Пирсона, но все ранво проведем его, скорее, ради академического интереса. Критерий Лиллиефорса - это модификация критерия Колмогорова-Смирнова для проверки сложных гипотез нормальности данных. Критерий Андерона-Дарлинга - это один из критериев типа w^2. Критерий Шапира-Уилка - примерно квадрат корреляции между x и y в n.p.p
Вес тела.
pearson.test(dfNew$BODY_WEI)
##
## Pearson chi-square normality test
##
## data: dfNew$BODY_WEI
## P = 10.032, p-value = 0.2628
lillie.test(dfNew$BODY_WEI)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew$BODY_WEI
## D = 0.11393, p-value = 0.04414
ad.test(dfNew$BODY_WEI)
##
## Anderson-Darling normality test
##
## data: dfNew$BODY_WEI
## A = 0.34994, p-value = 0.4621
shapiro.test(dfNew$BODY_WEI)
##
## Shapiro-Wilk normality test
##
## data: dfNew$BODY_WEI
## W = 0.98645, p-value = 0.7272
Вес мозга.
pearson.test(dfNew$BRAIN_WE)
##
## Pearson chi-square normality test
##
## data: dfNew$BRAIN_WE
## P = 5.4194, p-value = 0.712
lillie.test(dfNew$BRAIN_WE)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew$BRAIN_WE
## D = 0.066897, p-value = 0.7019
ad.test(dfNew$BRAIN_WE)
##
## Anderson-Darling normality test
##
## data: dfNew$BRAIN_WE
## A = 0.27742, p-value = 0.6414
shapiro.test(dfNew$BRAIN_WE)
##
## Shapiro-Wilk normality test
##
## data: dfNew$BRAIN_WE
## W = 0.98589, p-value = 0.697
Медленный сон.
pearson.test(dfNew$SLOWWAVE)
##
## Pearson chi-square normality test
##
## data: dfNew$SLOWWAVE
## P = 3.25, p-value = 0.861
lillie.test(dfNew$SLOWWAVE)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew$SLOWWAVE
## D = 0.071335, p-value = 0.7835
ad.test(dfNew$SLOWWAVE)
##
## Anderson-Darling normality test
##
## data: dfNew$SLOWWAVE
## A = 0.1832, p-value = 0.9056
shapiro.test(dfNew$SLOWWAVE)
##
## Shapiro-Wilk normality test
##
## data: dfNew$SLOWWAVE
## W = 0.98449, p-value = 0.7704
Быстрый сон.
pearson.test(dfNew$PARADOX)
##
## Pearson chi-square normality test
##
## data: dfNew$PARADOX
## P = 11.2, p-value = 0.1301
lillie.test(dfNew$PARADOX)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew$PARADOX
## D = 0.13226, p-value = 0.02883
ad.test(dfNew$PARADOX)
##
## Anderson-Darling normality test
##
## data: dfNew$PARADOX
## A = 1.6474, p-value = 0.0002722
shapiro.test(dfNew$PARADOX)
##
## Shapiro-Wilk normality test
##
## data: dfNew$PARADOX
## W = 0.87642, p-value = 8.731e-05
Сон.
pearson.test(dfNew$SLEEP)
##
## Pearson chi-square normality test
##
## data: dfNew$SLEEP
## P = 14.448, p-value = 0.0708
lillie.test(dfNew$SLEEP)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew$SLEEP
## D = 0.063108, p-value = 0.8187
ad.test(dfNew$SLEEP)
##
## Anderson-Darling normality test
##
## data: dfNew$SLEEP
## A = 0.38848, p-value = 0.3749
shapiro.test(dfNew$SLEEP)
##
## Shapiro-Wilk normality test
##
## data: dfNew$SLEEP
## W = 0.96874, p-value = 0.1396
Продолжительность жизни.
pearson.test(dfNew$LIFESPAN)
##
## Pearson chi-square normality test
##
## data: dfNew$LIFESPAN
## P = 7.6207, p-value = 0.4714
lillie.test(dfNew$LIFESPAN)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew$LIFESPAN
## D = 0.080606, p-value = 0.458
ad.test(dfNew$LIFESPAN)
##
## Anderson-Darling normality test
##
## data: dfNew$LIFESPAN
## A = 0.49892, p-value = 0.2021
shapiro.test(dfNew$LIFESPAN)
##
## Shapiro-Wilk normality test
##
## data: dfNew$LIFESPAN
## W = 0.97581, p-value = 0.2979
Продолжительность периода вынашивания потомства.
pearson.test(dfNew$GESTTIME)
##
## Pearson chi-square normality test
##
## data: dfNew$GESTTIME
## P = 7.2414, p-value = 0.5108
lillie.test(dfNew$GESTTIME)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew$GESTTIME
## D = 0.094533, p-value = 0.2216
ad.test(dfNew$GESTTIME)
##
## Anderson-Darling normality test
##
## data: dfNew$GESTTIME
## A = 0.60367, p-value = 0.1116
shapiro.test(dfNew$GESTTIME)
##
## Shapiro-Wilk normality test
##
## data: dfNew$GESTTIME
## W = 0.96749, p-value = 0.1216
Только несколько критериев отвергли нормальность распределений признаков с уровнем значимости 0.05.
3. Опишем разницу между животными по степени опасности места, где они спят.
dfNew %>% ggplot(aes(y=BODY_WEI, colour=EXP_IND)) + geom_boxplot()
dfNew %>% ggplot(aes(y=BRAIN_WE, colour=EXP_IND)) + geom_boxplot()
dfNew %>% ggplot(aes(y=SLOWWAVE, colour=EXP_IND)) + geom_boxplot()
dfNew %>% ggplot(aes(y=PARADOX, colour=EXP_IND)) + geom_boxplot()
dfNew %>% ggplot(aes(y=SLEEP, colour=EXP_IND)) + geom_boxplot()
dfNew %>% ggplot(aes(y=LIFESPAN, colour=EXP_IND)) + geom_boxplot()
dfNew %>% ggplot(aes(y=GESTTIME, colour=EXP_IND)) + geom_boxplot()
Можно заметить, что животные, живущие в более защищенных местах, 1,2) имеют меньший вес тела и мозга; 3,4,5) чаще дольше спят в общем и в разных фазах сна по отдельности; 6,7) имеют менее длительные продолжительность жизни и период вынашивания потомства.
Давайте проверим наблюдения 1,3) c помощью критериев для животных, живущих в ниболее и в наименее защищенных местах.
dfNew1 <- dplyr::filter(dfNew, EXP_IND == 1)
dfNew5 <- dplyr::filter(dfNew, EXP_IND == 5)
nrow(dfNew1)
## [1] 27
nrow(dfNew5)
## [1] 13
Ранее мы узнали, что многие признаки распределены нормально, но сейчас мы будем сравнивать разные группы индивидов, признаки внутри которых могут уже не имеют нормальность. Проверим это графически и критериями
ggplot(dfNew1, aes(sample = BODY_WEI)) +
stat_qq_point(size = 1) +
labs(x = "", y = "") +
stat_qq_line(color = "blue")
ggplot(dfNew1, aes(sample = SLEEP)) +
stat_qq_point(size = 1) +
labs(x = "", y = "") +
stat_qq_line(color = "blue")
ggplot(dfNew5, aes(sample = BODY_WEI)) +
stat_qq_point(size = 1) +
labs(x = "", y = "") +
stat_qq_line(color = "blue")
ggplot(dfNew5, aes(sample = SLEEP)) +
stat_qq_point(size = 1) +
labs(x = "", y = "") +
stat_qq_line(color = "blue")
Используем те же критерии, что использовали ранее.
Вес тела для животных, спящих в более защещенном месте.
pearson.test(dfNew1$BODY_WEI)
##
## Pearson chi-square normality test
##
## data: dfNew1$BODY_WEI
## P = 10.037, p-value = 0.07419
lillie.test(dfNew1$BODY_WEI)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew1$BODY_WEI
## D = 0.11889, p-value = 0.4219
ad.test(dfNew1$BODY_WEI)
##
## Anderson-Darling normality test
##
## data: dfNew1$BODY_WEI
## A = 0.42102, p-value = 0.3014
shapiro.test(dfNew1$BODY_WEI)
##
## Shapiro-Wilk normality test
##
## data: dfNew1$BODY_WEI
## W = 0.95246, p-value = 0.2459
Сон для животных, спящих в более защещенном месте.
pearson.test(dfNew1$SLEEP)
##
## Pearson chi-square normality test
##
## data: dfNew1$SLEEP
## P = 7.8462, p-value = 0.1649
lillie.test(dfNew1$SLEEP)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew1$SLEEP
## D = 0.14613, p-value = 0.1635
ad.test(dfNew1$SLEEP)
##
## Anderson-Darling normality test
##
## data: dfNew1$SLEEP
## A = 0.62141, p-value = 0.09438
shapiro.test(dfNew1$SLEEP)
##
## Shapiro-Wilk normality test
##
## data: dfNew1$SLEEP
## W = 0.93883, p-value = 0.1259
Вес тела для животных, спящих в менее защещенном месте.
pearson.test(dfNew5$BODY_WEI)
##
## Pearson chi-square normality test
##
## data: dfNew5$BODY_WEI
## P = 3.1538, p-value = 0.3685
lillie.test(dfNew5$BODY_WEI)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew5$BODY_WEI
## D = 0.1307, p-value = 0.7872
ad.test(dfNew5$BODY_WEI)
##
## Anderson-Darling normality test
##
## data: dfNew5$BODY_WEI
## A = 0.1708, p-value = 0.9112
shapiro.test(dfNew5$BODY_WEI)
##
## Shapiro-Wilk normality test
##
## data: dfNew5$BODY_WEI
## W = 0.98349, p-value = 0.9922
Сон для животных, спящих в менее защещенном месте.
pearson.test(dfNew5$SLEEP)
##
## Pearson chi-square normality test
##
## data: dfNew5$SLEEP
## P = 11.6, p-value = 0.008887
lillie.test(dfNew5$SLEEP)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: dfNew5$SLEEP
## D = 0.36483, p-value = 0.0004679
ad.test(dfNew5$SLEEP)
##
## Anderson-Darling normality test
##
## data: dfNew5$SLEEP
## A = 1.0639, p-value = 0.004763
shapiro.test(dfNew5$SLEEP)
##
## Shapiro-Wilk normality test
##
## data: dfNew5$SLEEP
## W = 0.76383, p-value = 0.00526
Нормальность отверглась с уровням значимости 0.05 толко для сная животных, спящих в менее защищенном месте. Причем по всем критериям отверглась.
Итак. Группы у нас независимые и некоторые из них имеют нормальное распределение.
4. Сравним распределения с помощью t-критериев для независимых выборок. Но сначала проверим гипотезу о равенстве дисперсий распределений.
Для веса тела можно использовать критерий Фишера, а для сна нельзя, так как для сна не выполняется нормальность, поэтому ему доверять не будем. Так же используем критерий Левена с модулями.
var.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI)
##
## F test to compare two variances
##
## data: dfNew1$BODY_WEI and dfNew5$BODY_WEI
## F = 1.53, num df = 26, denom df = 12, p-value = 0.4445
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.510403 3.810906
## sample estimates:
## ratio of variances
## 1.529963
var.test(dfNew1$SLEEP, dfNew5$SLEEP)
##
## F test to compare two variances
##
## data: dfNew1$SLEEP and dfNew5$SLEEP
## F = 5.0539, num df = 25, denom df = 9, p-value = 0.01559
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 1.402493 13.527538
## sample estimates:
## ratio of variances
## 5.053922
t.test(abs(dfNew1$BODY_WEI - mean(dfNew1$BODY_WEI, na.rm = TRUE)),
abs(dfNew5$BODY_WEI - mean(dfNew5$BODY_WEI, na.rm = TRUE)))
##
## Welch Two Sample t-test
##
## data: abs(dfNew1$BODY_WEI - mean(dfNew1$BODY_WEI, na.rm = TRUE)) and abs(dfNew5$BODY_WEI - mean(dfNew5$BODY_WEI, na.rm = TRUE))
## t = 1.0867, df = 27.477, p-value = 0.2866
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.4405109 1.4341732
## sample estimates:
## mean of x mean of y
## 2.149804 1.652973
t.test(abs(dfNew1$SLEEP - mean(dfNew1$SLEEP, na.rm = TRUE)),
abs(dfNew5$SLEEP - mean(dfNew5$SLEEP, na.rm = TRUE)))
##
## Welch Two Sample t-test
##
## data: abs(dfNew1$SLEEP - mean(dfNew1$SLEEP, na.rm = TRUE)) and abs(dfNew5$SLEEP - mean(dfNew5$SLEEP, na.rm = TRUE))
## t = 3.0191, df = 31.704, p-value = 0.004973
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.6008402 3.0957752
## sample estimates:
## mean of x mean of y
## 3.092308 1.244000
Гипотеза о равных дисперсиях не отверглась для веса, а для сна отверглась с уровнем значимости 0.05.
Посмотрим на t-критерии с равными и неравными дисперсиями для независимых выборок.
t.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI, var.equal=TRUE, alternative="less")
##
## Two Sample t-test
##
## data: dfNew1$BODY_WEI and dfNew5$BODY_WEI
## t = -5.981, df = 38, p-value = 3.022e-07
## alternative hypothesis: true difference in means is less than 0
## 95 percent confidence interval:
## -Inf -3.629947
## sample estimates:
## mean of x mean of y
## 6.902725 11.957552
t.test(dfNew1$SLEEP, dfNew5$SLEEP, var.equal=TRUE, alternative="greate")
##
## Two Sample t-test
##
## data: dfNew1$SLEEP and dfNew5$SLEEP
## t = 6.6383, df = 34, p-value = 6.464e-08
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
## 6.525758 Inf
## sample estimates:
## mean of x mean of y
## 12.94615 4.19000
t.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI, var.equal=FALSE, alternative="less")
##
## Welch Two Sample t-test
##
## data: dfNew1$BODY_WEI and dfNew5$BODY_WEI
## t = -6.4484, df = 28.943, p-value = 2.368e-07
## alternative hypothesis: true difference in means is less than 0
## 95 percent confidence interval:
## -Inf -3.722811
## sample estimates:
## mean of x mean of y
## 6.902725 11.957552
t.test(dfNew1$SLEEP, dfNew5$SLEEP, var.equal=FALSE, alternative="greate")
##
## Welch Two Sample t-test
##
## data: dfNew1$SLEEP and dfNew5$SLEEP
## t = 9.0835, df = 33.045, p-value = 8.383e-11
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
## 7.124839 Inf
## sample estimates:
## mean of x mean of y
## 12.94615 4.19000
Первый критерий точный, второй используется не по назначению, третий и четвертный ассимптотические. Как и предполагалось отверглись гипотезы в пользу того, что мы наблюдали на box-plot-ах выше.
5,6. Так как в случае сна удалось проверить гипотезу только асимптотическим критерием, а выборки у нас небольшие, воспользуемся непараметрическим t-критерием. А именно критерием Вилксона.
wilcox.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI, alternative="less", paired=FALSE)
## Warning in wilcox.test.default(dfNew1$BODY_WEI, dfNew5$BODY_WEI, alternative =
## "less", : cannot compute exact p-value with ties
##
## Wilcoxon rank sum test with continuity correction
##
## data: dfNew1$BODY_WEI and dfNew5$BODY_WEI
## W = 28, p-value = 1.092e-05
## alternative hypothesis: true location shift is less than 0
wilcox.test(dfNew1$SLEEP, dfNew5$SLEEP, alternative="greate", paired=FALSE)
## Warning in wilcox.test.default(dfNew1$SLEEP, dfNew5$SLEEP, alternative =
## "greate", : cannot compute exact p-value with ties
##
## Wilcoxon rank sum test with continuity correction
##
## data: dfNew1$SLEEP and dfNew5$SLEEP
## W = 255.5, p-value = 5.015e-06
## alternative hypothesis: true location shift is greater than 0
Мощность у этого критерия меньшая, но гипотезы так же отверглись.
Наконец используем двухвыборочный критерий Колмогорова-Смирнова, который имеет меньшую мощность, но у которого более общая альтернативная гипотеза.
ks.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI)
## Warning in ks.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI): cannot compute exact p-
## value with ties
##
## Two-sample Kolmogorov-Smirnov test
##
## data: dfNew1$BODY_WEI and dfNew5$BODY_WEI
## D = 0.73789, p-value = 0.0001416
## alternative hypothesis: two-sided
ks.test(dfNew1$SLEEP, dfNew5$SLEEP)
## Warning in ks.test(dfNew1$SLEEP, dfNew5$SLEEP): cannot compute exact p-value
## with ties
##
## Two-sample Kolmogorov-Smirnov test
##
## data: dfNew1$SLEEP and dfNew5$SLEEP
## D = 0.86154, p-value = 4.414e-05
## alternative hypothesis: two-sided
Гипотезы так же отверглись.
7. Устное задание.
8. Не актуально для текущих данных.
1. Посмотрим еще раз на ggpairs plot.
dfNew %>% dplyr::select(-NAME) %>%
ggpairs(diag=list(continuous = "barDiag"),
columns = c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))
dfNew %>% dplyr::select(-NAME) %>%
ggpairs(diag=list(continuous = "barDiag"), aes(colour=PRED_IND), legend=1,
columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))
dfNew %>% dplyr::select(-NAME) %>%
ggpairs(diag=list(continuous = "barDiag"), aes(colour=EXP_IND), legend=1,
columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))
dfNew %>% dplyr::select(-NAME) %>%
ggpairs(diag=list(continuous = "barDiag"), aes(colour=DANG_IND), legend=1,
columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))
Можно заметить 1) положительную корреляцию веса тела, веса мозга, продолжительности жизни и периода вынашивания потомства; 2) положительную корреляцию фаз сна и сна в общем смысле; 3) отрицательную корреляцию всего, что было перечислено в пункте 1), со всем, что было перечислено в пункте 2).
2. Посмотрим на линейные корреляции между признаками.
dplyr::select(dfNew, -NAME) %>%
mutate(PRED_IND = as.numeric(PRED_IND), EXP_IND = as.numeric(EXP_IND), DANG_IND = as.numeric(DANG_IND)) %>%
cor(method = "pearson", use = "pairwise.complete.obs") %>%
melt() %>%
ggplot(aes(X1, X2)) +
geom_raster(aes(fill = value)) +
geom_text(aes(label = round(value, 3))) +
scale_fill_gradient2(low=colors()[555], mid=colors()[1], high=colors()[26]) +
ggtitle("dfNew pearson") +
theme(axis.text.x = element_text(angle = 50, hjust = 1))
Видим подтверждение того, что наблюдали на ggpairs, еще заметны отрицательные корреляции индексов и сна. То есть чем в большей опасности находиться животное, тем меньше оно спит. Еще заметна сильная корреляция между размерами животного и незащищенностью места, где оно спит.
3. Теперь посмотрим на ранговоые корреляции между признаками.
dplyr::select(dfNew, -NAME) %>%
mutate(PRED_IND = as.numeric(PRED_IND), EXP_IND = as.numeric(EXP_IND), DANG_IND = as.numeric(DANG_IND)) %>%
cor(method = "spearman", use = "pairwise.complete.obs") %>%
melt() %>%
ggplot(aes(X1, X2)) +
geom_raster(aes(fill = value)) +
geom_text(aes(label = round(value, 3))) +
scale_fill_gradient2(low=colors()[555], mid=colors()[1], high=colors()[26]) +
ggtitle("dfNew spearman") +
theme(axis.text.x = element_text(angle = 50, hjust = 1))
Больших изменений нет. Где-то значение корреляции стало чуть меньше, где-то чуть больше. Это связано с тем, что некоторые зависимости лучше описывабтся линейно, некоторые хуже.
4. Также посчитаем интересные частные корреляции.
library(ppcor)
Посмотрим на частную корреляцию веса животного и сна за вычетом идексов опасности.
((dplyr::select(dfNew, -NAME, -BRAIN_WE, -LIFESPAN, -GESTTIME, -SLOWWAVE, -PARADOX) %>%
mutate(PRED_IND = as.numeric(PRED_IND), EXP_IND = as.numeric(EXP_IND), DANG_IND = as.numeric(DANG_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["SLEEP", "BODY_WEI"]
## [1] -0.2668484
((dplyr::select(dfNew, -NAME, -BRAIN_WE, -LIFESPAN, -GESTTIME, -SLEEP, -PARADOX) %>%
mutate(PRED_IND = as.numeric(PRED_IND), EXP_IND = as.numeric(EXP_IND), DANG_IND = as.numeric(DANG_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["SLOWWAVE", "BODY_WEI"]
## [1] -0.2870771
((dplyr::select(dfNew, -NAME, -BRAIN_WE, -LIFESPAN, -GESTTIME, -SLOWWAVE, -SLEEP) %>%
mutate(PRED_IND = as.numeric(PRED_IND), EXP_IND = as.numeric(EXP_IND), DANG_IND = as.numeric(DANG_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["PARADOX", "BODY_WEI"]
## [1] -0.003219317
Посмотрим на частые корреляции индексов опасности животного и сна за вычетом веса и связанных с ним критериев.
((dplyr::select(dfNew, -NAME, -EXP_IND, -DANG_IND, -SLOWWAVE, -PARADOX) %>%
mutate(PRED_IND = as.numeric(PRED_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["SLEEP", "PRED_IND"]
## [1] -0.4838444
((dplyr::select(dfNew, -NAME, -EXP_IND, -DANG_IND, -SLEEP, -PARADOX) %>%
mutate(PRED_IND = as.numeric(PRED_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["SLOWWAVE", "PRED_IND"]
## [1] -0.2729752
((dplyr::select(dfNew, -NAME, -EXP_IND, -DANG_IND, -SLOWWAVE, -SLEEP) %>%
mutate(PRED_IND = as.numeric(PRED_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["PARADOX", "PRED_IND"]
## [1] -0.5605862
((dplyr::select(dfNew, -NAME, -PRED_IND, -DANG_IND, -SLOWWAVE, -PARADOX) %>%
mutate(EXP_IND = as.numeric(EXP_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["SLEEP", "EXP_IND"]
## [1] -0.4055336
((dplyr::select(dfNew, -NAME, -PRED_IND, -DANG_IND, -SLEEP, -PARADOX) %>%
mutate(EXP_IND = as.numeric(EXP_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["SLOWWAVE", "EXP_IND"]
## [1] -0.2385904
((dplyr::select(dfNew, -NAME, -PRED_IND, -DANG_IND, -SLOWWAVE, -SLEEP) %>%
mutate(EXP_IND = as.numeric(EXP_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["PARADOX", "EXP_IND"]
## [1] -0.4508023
((dplyr::select(dfNew, -NAME, -PRED_IND, -EXP_IND, -SLOWWAVE, -PARADOX) %>%
mutate(DANG_IND = as.numeric(DANG_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["SLEEP", "DANG_IND"]
## [1] -0.5687154
((dplyr::select(dfNew, -NAME, -PRED_IND, -EXP_IND, -SLEEP, -PARADOX) %>%
mutate(DANG_IND = as.numeric(DANG_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["SLOWWAVE", "DANG_IND"]
## [1] -0.366575
((dplyr::select(dfNew, -NAME, -PRED_IND, -EXP_IND, -SLOWWAVE, -SLEEP) %>%
mutate(DANG_IND = as.numeric(DANG_IND)) %>%
drop_na() %>%
pcor(method = "spearman"))$estimate %>%
as.data.frame())["PARADOX", "DANG_IND"]
## [1] -0.623655
Итог: